/**
 * 队列结构的封装
 */
// 声明队列类
class Queue {
  constructor () {
    this.items = []
  }
  // 入队 将元素添加到队列中
  enqueue (item) {
    this.items.push(item)
  }
  // 出队 从队列中删除对头元素 返回删除的那个元素
  dequeue () {
    // 删除数组中的第一个元素
    return this.items.shift()
  }
  // 查看队头元素
  front () {
    return this.items[0]
  }
  // 查看队列是否为空
  isEmpty () {
    return this.items.length === 0
  }
  // 查看队列中元素的个数
  size () {
    return this.items.length
  }
  // 将队列中的元素以字符串形式返回
  toString () {
    let result = ''
    for (let item of this.items) {
      result += item + ''
    }
    return result
  }
}
// const queue = new Queue()
// queue.enqueue('a')
// queue.enqueue('b')
// queue.enqueue('c')
// queue.enqueue('d')
// console.log(queue);
// // 出队
// queue.dequeue()
// queue.dequeue()
// console.log(queue);
// console.log(queue.front(),'队头元素');
// console.log(queue.size());
// // queue.dequeue()
// // queue.dequeue()
// //查看队列是否为空
// console.log(queue.isEmpty());
// console.log(queue.toString());


// 击鼓传花的规则是：有 n 个人围成一圈，从第一个人开始报数，数到 m 的人出局，然后从下一个人重新开始报数，数到 m 的人再出局，直到剩下最后一个人为止。
// 利用循环队列 可以实现击鼓传花的游戏。
// 循环队列是一种特殊的队列，当队列中的元素个数达到队列的最大容量时，再往队列中添加元素，会覆盖掉队列中最早添加的元素。
/**
 * 
 * @param {*} nameList  参与游戏的人
 * @param {*} num 数到几的人出局
 */
function passGame (nameList, number) {
  // 创建队列
  const queue = new Queue()
  for (let i = 0; i < nameList.length; i++) {
    // 将玩游戏的人入队
    queue.enqueue(nameList[i])
  }
  // 开始数数 当队列中只剩下一个元素时就停止数数
  while (queue.size() > 1) {
    // number 数字之前的人重新放入到队尾 把队头删除的元素重新加入到队列中
    for (let index = 0; index < number - 1; index++) {
      queue.enqueue(queue.dequeue())
    }
    // number 对应这个人 直接从队列中删除
    // 由于队列没有像数组一样的下标值不能直接拉取到某一元素 
    // 所以采用把number 前面的numbr -1个元素先删除添加到队列末尾
    // 此时number个元素就派排到了队列的最前面 可以直接使用dequeue方法进行删除
    queue.dequeue()
    // 获取最后剩下的那个人
    const endName = queue.front()
    // 返回这个人在原数组中对应的索引
    // return nameList.indexOf(endName)
    return endName
  }
}
console.log(passGame(['a', 'b', 'c', 'd'], 2));